{
  function id<T>(value:T): T {
    return value
  }

  id<string>('abc')

}
{
  // 多个类型变量
  // TS
  function f<Type,Result>(a: Type, b: Result): [Type, Result] {
    return [a, b]
  }

  let r1 = f<number, boolean>(100, false)

  // JS
  // function f(a,b){
  //   return [a,b]
  // }

}

{
  // js
  // 多个类型变量之间，可以相互约束
  let obj = { a: 1, b:2 }
  // 访问对象的属性
  console.log(obj.c) // ===> undefined

  // 目标封装一个函数
  //    getProp(对象，属性名) ===》 属性值
  function getProp(obj, prop) {
    return obj[prop]
  }

  getProp(obj, 'a') // ==> 1
}

{
  // TS
  // 多个类型变量之间，可以相互约束
  let obj = { a: 1, b:2, c: 'abc' }

  // 目标封装一个函数
  //    getProp(对象，属性名) ===》 属性值
  function getProp(obj: object, prop: string) : any {
    return obj[prop]
  }
  // 希望prop只能是obj中已有的属性，如果不存在，就报错
  let r1 = getProp(obj, "abc")
}


{
  // TS
  // 多个类型变量之间，可以相互约束
  let obj = { a: 1, b:2, c: 'abc', abc: 100 }

  // 目标封装一个函数
  //    getProp(对象，属性名) ===》 属性值
  function getProp<Obj, Key extends keyof Obj>(obj: Obj, prop: Key) : any {
    return obj[prop]
  }
  // 希望prop只能是obj中已有的属性，如果不存在，就报错
  getProp(obj, "abc")
}

{
  type MyType = { a: string, b: string }
  type K = keyof MyType

  let a:K = ''



}
export {}